/**
 * Software License, Version 1.0
 * 
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering, 
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 *GENERATED USING SOFTWARE.
 */
package cgl.narada.aggregator;

import java.io.FileInputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.xpath.XPathAPI;
import org.w3c.dom.Document;
import org.w3c.dom.traversal.NodeIterator;
import org.xml.sax.InputSource;

public class XmlMatching {
  boolean gatherResults = true;
  public XmlMatching(){}

  public XmlMatching(String filename, String xpath){
    Document doc=getDocumentFromFile(filename);
    processQuery(doc, xpath);

  }

  public boolean processQuery(Document document, String xpath) {
    try {
      NodeIterator nl = XPathAPI.selectNodeIterator(document, xpath);
      if (nl.nextNode()!= null) {
        System.out.println("The document matches the query => " + xpath);
        return true;
      }
    } catch (javax.xml.transform.TransformerException transEx) {
      System.out.println(transEx);
    }
    System.out.println("The document DOES NOT match the query => " + xpath);
    return false;
  }

  public Document getDocumentFromFile(String filename) {
    try {
      InputSource in = new InputSource(new FileInputStream(filename));
      DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
      dfactory.setNamespaceAware(true);
      Document doc = dfactory.newDocumentBuilder().parse(in);
      return doc;
    } catch (IOException ioe) {
      System.out.println(ioe);
    } catch (org.xml.sax.SAXException saxEx) {
      System.out.println(saxEx);
    } catch (javax.xml.parsers.ParserConfigurationException configEx) {
      System.out.println(configEx);
    }
    return null;
  }

  public boolean checkLatency(String filename, String xpath){
    Document doc=getDocumentFromFile(filename);
    return processQuery(doc, xpath);
  }

  public boolean jitter(String filename, String xpath){
    Document doc=getDocumentFromFile(filename);
    return processQuery(doc, xpath);
  }
  public boolean throughput(String filename, String xpath){
    Document doc=getDocumentFromFile(filename);
    return processQuery(doc, xpath);
  }
  public boolean dataRate(String filename, String xpath){
    Document doc=getDocumentFromFile(filename);
    return processQuery(doc, xpath);
  }




  public static void main(String[] args) {
    XmlMatching matching = new XmlMatching();
    String filename = "C:\\test\\old\\test9600.xml";
    String query = "P_Metrics/performancedata[avg_latency=9999]";
    long totald=0;
    long total=0;
    for(int i=0; i<10; i++){
      long starttime = System.currentTimeMillis();
      Document document = matching.getDocumentFromFile(filename);
      long endtime = System.currentTimeMillis();
      System.out.println("time" + (endtime - starttime));
      totald+=(endtime-starttime);
      starttime = System.currentTimeMillis();
      matching.processQuery(document, query);
      endtime = System.currentTimeMillis();
      System.out.println("time" + (endtime - starttime));
      total+=(endtime-starttime);
    }
    System.out.println("timed...:" + totald/10);
    System.out.println("time....:" + total/10);


  }/*end - main */

public void processQueryOld(Document document, String xpath) {
  try {
    NodeIterator nl = XPathAPI.selectNodeIterator(document, xpath);
    if (nl.nextNode()!= null) {
      System.out.println("The document matches the query => " + xpath);
      return;
    }
  } catch (javax.xml.transform.TransformerException transEx) {
    System.out.println(transEx);
  }
  System.out.println("The document DOES NOT match the query => " + xpath);
}


}//end XmlMatching
